#include "music.h"

#include<QUuid>
#include<QMediaPlayer>
#include<QCoreApplication>
#include <QSqlQuery>
#include <QSqlError>

Music::Music()
    :isLike(false)
    ,isHistory(false)
{

}



Music::Music(const QUrl& url)
    :isLike(false)
    ,isHistory(false)
    ,musicUrl(url)
{

    //读取url对应的歌曲文件的信息，解析出元数据

    musicId = QUuid::createUuid().toString();//创建歌曲的uuid，保证唯一性

    // 把函数放在在Music的构造函数中调⽤，当创建⾳乐对象时，顺便完成歌曲⽂件的加载
     parseMediaMetaData();

}


void Music::setMusicName(const QString &musicName)
{
    this->musicName = musicName;
}

void Music::setSingerName(const QString &singerName)
{
    this->singerName = singerName;
}

void Music::setAlbumName(const QString &albumName)
{
    this->albumName = albumName;
}


void Music::setDuration(qint64 duration)
{
    this->duration = duration;
}

void Music::setIsLike(bool isLike)
{
    this->isLike = isLike;
}

void Music::setIsHistory(bool isHistory)
{
    this->isHistory = isHistory;
}

void Music::setMuicUrl(const QUrl &url)
{
    this->musicUrl = url;
}

void Music::setMusicId(const QString &musicId)
{
    this->musicId = musicId;
}





QString Music::getMusicName() const
{
    return musicName;
}

QString Music::getSingerName()const
{
    return singerName;
}

QString Music::getAlbumName()const
{
    return  albumName;
}

qint64 Music::getDuration()const
{
    return duration;
}

bool Music::getIsLike()const
{
    return isLike;
}

bool Music::getIsHistory()const
{
    return isHistory;
}

QUrl Music::getMuicUrl()const
{
    return musicUrl;
}

QString Music::getMusicId()const
{
    return musicId;
}

QString Music::getLrcFilePath() const
{
    //⾳频⽂件和LRC⽂件在⼀个⽂件夹下
    //直接将⾳频⽂件的后缀替换为.lrc
    QString path = musicUrl.toLocalFile();//获取url路径
    path.replace(".mp3",".lrc");
    path.replace(".flac",".lrc");
    path.replace(".mpga",".lrc");
    return path;
}

void Music::insertMusicToDB()
{
    QSqlQuery query;
    // SELECT EXISTS(⼦查询) ： ⼦查询中如果有记录，SELECT EXISTS返回TRUE
    // 如果⼦查询中没有满⾜条件的记录， SELECT EXISTS返回FALSE
    query.prepare("select exists (select 1 from musicInfo where musicId = ?)");
    query.addBindValue(musicId);
    if(!query.exec())
    {
        qDebug()<<"查询失败"<<query.lastError().text();
        return;
    }
    if(query.next())
    {
        bool isExists = query.value(0).toBool();
        if(isExists)
        {
            //当前歌曲在数据库中存在
            //不需要再插⼊musci对象，此时只需要将isLike和isHistory属性进⾏更新
            query.prepare("update musicInfo set isLike = ?,isHistory = ? where musicId = ?");
            query.addBindValue(isLike? 1 : 0);
            query.addBindValue(isHistory? 1:0);
            query.addBindValue(musicId);
            if(!query.exec())
             {
                qDebug()<<"更新失败: "<<query.lastError().text();
             }
             qDebug()<<"更新music信息: "<<musicName<<" "<<musicId;
        }
        else if(!isExists)
        {
            //当前歌曲在数据库中不存在
            //将music对象插入数据库
            query.prepare("insert into musicInfo(musicId,musicName,singerName,albumName,duration,musicUrl,isLike,isHistory)\
                            values(?,?,?,?,?,?,?,?)");
            query.addBindValue(musicId);
            query.addBindValue(musicName);
            query.addBindValue(singerName);
            query.addBindValue(albumName);
            query.addBindValue(duration);
            query.addBindValue(musicUrl);
            query.addBindValue(isLike?1:0);
            query.addBindValue(isHistory?1:0);
            if(!query.exec())
            {
               qDebug()<<"插⼊失败: "<<query.lastError().text();
               return;
            }
             qDebug()<<"插⼊music信息: "<<musicName<<" "<<musicId;
        }
    }
}

void Music::parseMediaMetaData()
{

    //创建QMediaPlayer对象

    QMediaPlayer mediaplayer;
    mediaplayer.setMedia(musicUrl);


    //媒体元数据解析需要时间，但是setMedia不会再解析完成之后再返回而是立即返回
    //只有等待解析完成之后，才能提取⾳乐信息
    //所以用isMetaDataAvailable()来判断
    while(!mediaplayer.isMetaDataAvailable())
    {
        //循环等待时：主界⾯消息循环就⽆法处理了，因此需要在等待解析期间，让消息循环继续处理
        QCoreApplication::processEvents();
    }

    //解析完媒体元数据后再提取元数据信息
    if(mediaplayer.isMetaDataAvailable())
    {
        //metaDate返回的是QVariant类型
        musicName =  mediaplayer.metaData("Title").toString();
        singerName = mediaplayer.metaData("Author").toString();
        albumName = mediaplayer.metaData("AlbumTitle").toString();
        duration = mediaplayer.metaData("Duration").toLongLong();


        //如果音乐文件本身有问题就会导致媒体元数据解析失败
        //根据musicUrl获取文件名字
        QString filename = musicUrl.fileName();
        //找-的位置
        int index = filename.indexOf("-");//如果为-1就没有找到-

        //对musicName为空的处理
        if(musicName.isEmpty())
        {
            if(index != -1)
            {
                //2002年的第一场雪 - 刀郎.mp3"
               musicName = filename.mid(0,index);
            }
            //如果为-1就没有找到-
            else
            {
                //2002年的第一场雪.mp3"
                musicName = filename.mid(0,filename.indexOf("."));
            }
        }
        //singer为空的处理
        if(singerName.isEmpty())
        {
            if(index != -1)
            {
                singerName = filename.mid(index+1,filename.indexOf("0") - index-1);
            }
            else
            {
                singerName = "未知歌手";
            }
        }
        if(albumName.isEmpty())
        {
            albumName = "未知专辑";
        }
        //将singerName的前后的空字符串去掉，而中间的空字符串不会变
        singerName = singerName.trimmed();
        qDebug()<<musicName<<" "<<singerName<<" "<<albumName<<" "<<duration;
    }
}


